A memory controller manages the flow of data being written to and read from a physical memory. A “read request” is a request to read data from memory and may comprise an address in memory to be read from and an identifier of the device desiring to read from memory. A “write request” is a request to write data to memory and may comprise the data to be written, the address in memory to write the data to, and an identifier of the device desiring to write to memory. Read requests and write requests from a particular device enter the memory controller by way of a port. A multi-port memory controller is a memory controller that is capable of servicing read requests and write requests from more than one device, where each device is assigned to a particular port of the memory controller.
Many different devices require access to physical memory for various reasons (e.g., storing pointers, data). To reduce cost, these devices may share a single physical memory, which can lead to many memory requests for the same resource. Not all memory requests can be fulfilled simultaneously, so write buffers are used to hold pending write data while other write data is written to memory. Each port has a dedicated write buffer, which allows write requests coming into a port to be absorbed without having to immediately write the associated write data to memory. Often, one port of a memory controller has a low demand for memory access while another port has a high demand for memory access, thus one buffer is not being utilized as frequently as another buffer.